|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(******************************************************************************) (**) ОТДЕЛ ЦелОселок+; (****************************************************************************** * Приложение: "Dhrystone" (скорость целочисленных операций) * Автор: Reinhold P. Weicker * Издано в: CACM Т.27, № 10, 10/1984, с.1013 ******************************************************************************* * Испытание на скорость работы обычного приложения. В этом приложении: * присваиваний - 53% * целочисленных действий - 32% * вызовов задач - 15%. * Ничего путного данное приложение не вычисляет. ******************************************************************************) ИСПОЛЬЗУЕТ ОС ИЗ "...\Отделы\Обмен\", Вывод ИЗ "...\Отделы\Обмен\"; ПОСТ LOOPS = 5000; Ident1 = 1; Ident2 = 2; Ident3 = 3; Ident4 = 4; Ident5 = 5; ВИД Enumeration =ЦЕЛ; ВИД OneToThirty =ЦЕЛ; ВИД OneToFifty =ЦЕЛ; ВИД CapitalLetter=ЗНАК; ВИД String30 =ЦЕПЬ[31]; ВИД Array1Dim =РЯД 51 ИЗ ЦЕЛ; ВИД Array2Dim =РЯД 51,51 ИЗ ЦЕЛ; RecordType = НАБОР PtrComp :ЦЕЛ; Discr :Enumeration; EnumComp :Enumeration; IntComp :OneToFifty; StringComp:String30 КОН; ПЕР IntGlob :ЦЕЛ; BoolGlob :КЛЮЧ; Char1Glob :ЗНАК; Char2Glob :ЗНАК; Array1Glob:Array1Dim; Array2Glob:Array2Dim; MyRec :РЯД 3 ИЗ RecordType; ПОСТ PtrGlb =1; PtrGlbNext=2; ЗАДАЧА Proc7(IntParI1,IntParI2,IntParOut+:OneToFifty); ПЕР IntLoc:OneToFifty; УКАЗ IntLoc:=IntParI1+2; IntParOut:=IntParI2+IntLoc КОН Proc7; ЗАДАЧА Proc3(inRecIdx+:ЦЕЛ); УКАЗ ЕСЛИ inRecIdx # 0 ТО inRecIdx:=MyRec[PtrGlb].PtrComp ИНАЧЕ IntGlob:=100 КОН; Proc7(10,IntGlob,MyRec[PtrGlb].IntComp) КОН Proc3; ЗАДАЧА Func3(EnumParIn:Enumeration):КЛЮЧ; ПЕР EnumLoc:Enumeration; УКАЗ EnumLoc:=EnumParIn; ВОЗВРАТ EnumLoc=Ident3 КОН Func3; ЗАДАЧА Proc6(EnumParIn,EnumParOut+:Enumeration); УКАЗ EnumParOut:=EnumParIn; ЕСЛИ НЕ Func3(EnumParIn) ТО EnumParOut:=Ident4 КОН; ВЫБРАТЬ EnumParIn ИЗ | Ident1: EnumParOut:=Ident1 | Ident2: ЕСЛИ IntGlob > 100 ТО EnumParOut:=Ident1 ИНАЧЕ EnumParOut:=Ident4 КОН | Ident3: EnumParOut:=Ident2 | Ident4: ; | Ident5: EnumParOut:=Ident3 КОН КОН Proc6; ЗАДАЧА Proc1(inIdx:ЦЕЛ); ПЕР i:ЦЕЛ; УКАЗ i:=MyRec[inIdx].PtrComp; MyRec[i]:=MyRec[PtrGlb]; MyRec[inIdx].IntComp:=5; MyRec[i].IntComp:=MyRec[inIdx].IntComp; MyRec[i].PtrComp:=i; Proc3(MyRec[i].PtrComp); ЕСЛИ MyRec[i].Discr=Ident1 ТО MyRec[i].IntComp:=6; Proc6(MyRec[inIdx].EnumComp,MyRec[i].EnumComp); MyRec[i].PtrComp:=MyRec[PtrGlb].PtrComp; Proc7(MyRec[i].IntComp,10,MyRec[i].IntComp) ИНАЧЕ MyRec[inIdx]:=MyRec[i] КОН КОН Proc1; ЗАДАЧА Proc2(IntParIO+:OneToFifty); ПЕР IntLoc :OneToFifty; EnumLoc:Enumeration; УКАЗ IntLoc:=IntParIO+10; ПОВТОРЯТЬ ЕСЛИ Char1Glob='A' ТО IntLoc:=IntLoc-1; IntParIO:=IntLoc-IntGlob; EnumLoc:=Ident1 КОН ДО EnumLoc=Ident1 КОН Proc2; ЗАДАЧА Proc4; ПЕР BoolLoc:КЛЮЧ; УКАЗ BoolLoc:=(Char1Glob='A'); BoolLoc:=(BoolLoc ИЛИ BoolGlob); Char2Glob:='B' КОН Proc4; ЗАДАЧА Proc5; УКАЗ Char1Glob:='A'; BoolGlob:=ОТКЛ КОН Proc5; ЗАДАЧА Proc8(Array1Par+:Array1Dim; Array2Par+:Array2Dim; IntParI1,IntParI2:OneToFifty); ПЕР IntLoc :OneToFifty; IntIndex:OneToFifty; УКАЗ IntLoc:=IntParI1+5; Array1Par[IntLoc]:=IntParI2; Array1Par[IntLoc+1]:=Array1Par[IntLoc]; Array1Par[IntLoc+30]:=IntLoc; ОТ IntIndex:=IntLoc ДО IntLoc+1 ВЫП Array2Par[IntLoc,IntIndex]:=IntLoc КОН; Array2Par[IntLoc+20,IntLoc]:=Array1Par[IntLoc]; IntGlob:=5 КОН Proc8; ЗАДАЧА Func1(CharPar1,CharPar2:CapitalLetter):Enumeration; ПЕР CharLoc1,CharLoc2:CapitalLetter; УКАЗ CharLoc1:=CharPar1; CharLoc2:=CharLoc1; ЕСЛИ CharLoc2 # CharPar2 ТО ВОЗВРАТ Ident1 ИНАЧЕ ВОЗВРАТ Ident2 КОН КОН Func1; ЗАДАЧА Func2(StrParI1+,StrParI2+:String30):КЛЮЧ; ПЕР IntLoc :OneToThirty; CharLoc:CapitalLetter; УКАЗ IntLoc:=2; ПОКА (IntLoc <= 2) ВЫП ЕСЛИ Func1(StrParI1[IntLoc],StrParI2[IntLoc+1])=Ident1 ТО CharLoc:='A'; IntLoc:=IntLoc+1 КОН КОН; ЕСЛИ (CharLoc >= 'W') И (CharLoc <= 'Z') ТО IntLoc:=7 КОН; ЕСЛИ CharLoc='X' ТО ВОЗВРАТ ВКЛ АЕСЛИ StrParI1 > StrParI2 ТО IntLoc:=IntLoc+7; ВОЗВРАТ ВКЛ ИНАЧЕ ВОЗВРАТ ОТКЛ КОН КОН Func2; ЗАДАЧА Proc0; ПЕР IntLoc1 :OneToFifty; IntLoc2 :OneToFifty; IntLoc3 :OneToFifty; CharLoc :ЗНАК; CharIndex :ЗНАК; EnumLoc :Enumeration; String1Loc, String2Loc:String30; i,j :ЦЕЛ; УКАЗ MyRec[PtrGlb].PtrComp:=PtrGlbNext; MyRec[PtrGlb].Discr:=Ident1; MyRec[PtrGlb].EnumComp:=Ident3; MyRec[PtrGlb].IntComp:=40; MyRec[PtrGlb].StringComp:="DHRYSTONE PROGRAM, SOME STRING"; String1Loc:="DHRYSTONE PROGRAM, 1'ST STRING"; ОТ i:=1 ДО LOOPS ВЫП ОТ j:=1 ДО 1000 ВЫП Proc5; Proc4; IntLoc1:=2; IntLoc2:=3; String2Loc:="DHRYSTONE PROGRAM, 2'ND STRING"; EnumLoc:=Ident2; BoolGlob:=НЕ Func2(String1Loc,String2Loc); ПОКА IntLoc1 < IntLoc2 ВЫП IntLoc3:=5*IntLoc1-IntLoc2; Proc7(IntLoc1,IntLoc2,IntLoc3); IntLoc1:=IntLoc1+1 КОН; Proc8(Array1Glob,Array2Glob,IntLoc1,IntLoc3); Proc1(PtrGlb); CharIndex:='A'; ПОКА CharIndex <= Char2Glob ВЫП ЕСЛИ EnumLoc=Func1(CharIndex,'C') ТО Proc6(Ident1,EnumLoc) КОН; CharIndex:=ВЗНАК(ВЦЕЛ(CharIndex)+1) КОН; IntLoc3:=IntLoc2*IntLoc1; IntLoc2:=IntLoc3 ДЕЛИТЬ IntLoc1; IntLoc2:=7*(IntLoc3-IntLoc2)-IntLoc1; Proc2(IntLoc1) КОН КОН КОН Proc0; ЗАДАЧА Голова; ПЕР начВремя:ЦЕЛ; УКАЗ Вывод.Цепь("Испытание на Dhrystone (скорость целочисленных операций)"); начВремя:=ОС.Время(); Proc0; Вывод.ЧВещ(" - %f с^",(ОС.Время()-начВремя)/1000,0,0,0) КОН Голова; УКАЗ Голова КОН ЦелОселок. ▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|